package br.ufscar.acumaaf.smc.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import br.ufscar.acumaaf.smc.model.DadoSessao;
import br.ufscar.acumaaf.smc.persistence.DataBaseHelper;

public class DadoSessaoDAO {

	private DataBaseHelper dataBaseHelper;
	private SQLiteDatabase db;
	
	public DadoSessaoDAO(Context context) {
		dataBaseHelper = new DataBaseHelper(context);
		db = dataBaseHelper.getWritableDatabase();
	}
	
	public boolean inserirDadoSessao(DadoSessao dadoSessao){
		ContentValues dado = new ContentValues();
		dado.put("codigosessao", dadoSessao.getCodigoSessao());
		dado.put("codigoinstrumentocoleta", dadoSessao.getCodigoInstrumentoColeta());
		dado.put("codigousuario", dadoSessao.getCodigoUsuario());
		dado.put("valor",dadoSessao.getValor());
		try{
			Long retorno = db.insert("dadosessao", null, dado);
			Log.i(DataBaseHelper.FILTRO, "DadoSessaoDAO:insereDadoSessao | Inserindo " + dado + " no Banco de Dados. Retorno = " + retorno + " (ID da linha recém-inserida ou -1 caso tenha ocorrido um erro!)");
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:insereDadoSessao | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			if(retorno == Long.valueOf("-1")){
				Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:insereDadoSessao | Retorno false!");
				return false;
			}
			else{
				Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:insereDadoSessao | Retorno true!");
				return true;
			}
		} catch (Exception e) {
			Log.e("erro", "DadoSessaoDAO:insereDadoSessao | Gerou uma exceção e não inseriu o dadoSessao no Banco de Dados", e);
			return false;
		}
	}
	
	public boolean atualizaDadoSessao(DadoSessao dadoSessao){
		ContentValues dado = new ContentValues();
		dado.put("codigosessao", dadoSessao.getCodigoSessao());
		dado.put("codigoinstrumentocoleta", dadoSessao.getCodigoInstrumentoColeta());
		dado.put("codigousuario", dadoSessao.getCodigoUsuario());
		dado.put("valor",dadoSessao.getValor());
		int retorno = db.update("dadosessao", dado, "codigodadosessao = " + dadoSessao.getCodigoDadoSessao(), null);
		if(retorno > 0){
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:atualizaDadoSessao | Atualizando o DadoSessao de código " + dadoSessao.getCodigoDadoSessao() + " do Banco de Dados. Retorno = " + retorno + "(Número de linhas afetadas pela atualização!)");
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:atualizaDadoSessao | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			return true;
		}
		else{
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:atualizaDadoSessao | Falha ao tentar atualizar um DadoSessao. Retorno = " + retorno + "(Número de linhas afetadas pela atualização!)");
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:atualizaDadoSessao | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			return false;
		}			
	}
	
	public void deletaDadoSessao(Long codigo){
		int retorno = db.delete("dadosessao", "codigodadosessao = " + codigo, null);
		if(retorno > 0){
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:deletaDadoSessao | Deletando o DadoSessao de código " + codigo + " do Banco de Dados. Retorno = " + retorno + "(Número de linhas afetadas pela Deleção!)");
		}
		else{
			Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:deletaDadoSessao | Falha ao tentar deletar um DadoSessao. Retorno = " + retorno + "(Número de linhas afetadas pela Deleção!)");
		}
		Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:deletaDadoSessao | Fechando o Bando de Dados!");
		//fechando o Banco de Dados
		dataBaseHelper.close();
		db.close();
	}
	
	public DadoSessao buscarDadoSessaoPeloCodigo(Integer codigo){
		Cursor cursor = null;
		DadoSessao dadoSessao = new DadoSessao();
		try {
			 cursor = db.query(true, "dadosessao", new String[]{"codigodadosessao","codigosessao","codigousuario","codigoinstrumentocoleta","valor"} , "codigodadosessao = " + codigo, null, null, null, null, null);
			 if(cursor.getCount() > 0){
				int codigoDadoSessaoIndex = cursor.getColumnIndex("codigodadosessao");
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int codigoInstrumentoColetaIndex = cursor.getColumnIndex("codigoinstrumentocoleta");
				int valorIndex = cursor.getColumnIndex("valor");
				cursor.moveToFirst();
				dadoSessao.setCodigoDadoSessao(cursor.getInt(codigoDadoSessaoIndex));
				dadoSessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
				dadoSessao.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
				dadoSessao.setCodigoInstrumentoColeta(cursor.getInt(codigoInstrumentoColetaIndex));
				dadoSessao.setValor(cursor.getString(valorIndex));
				cursor.moveToNext();
			}
			 Log.i(DataBaseHelper.FILTRO,"DadoSessaoDAO:buscarDadoSessaoPeloCodigo | Retornando o dadoSessao " + dadoSessao);
			 if(cursor != null){
					cursor.close();
					dataBaseHelper.close();
					db.close();
				}
			 return dadoSessao;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				db.close();
			}
		}
	}

	public List<DadoSessao> buscarTodosDadosSessoes(){
		Cursor cursor = null;
		try {
			List<DadoSessao> listaDadosSessoes = new ArrayList<DadoSessao>();
			cursor = db.query("dadosessao", new String[]{"codigodadosessao", "codigosessao", "codigousuario", "codigoinstrumentocoleta", "valor"}, null, null, null, null, null);
			if(cursor.getCount() > 0){
				int codigoDadoSessaoIndex = cursor.getColumnIndex("codigodadosessao");
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int codigoInstrumentoColetaIndex = cursor.getColumnIndex("codigoinstrumentocoleta");
				int valorIndex = cursor.getColumnIndex("valor");
				cursor.moveToFirst();
				do{
					DadoSessao dadoSessao = new DadoSessao();
					dadoSessao.setCodigoDadoSessao(cursor.getInt(codigoDadoSessaoIndex));
					dadoSessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
					dadoSessao.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
					dadoSessao.setCodigoInstrumentoColeta(cursor.getInt(codigoInstrumentoColetaIndex));
					dadoSessao.setValor(cursor.getString(valorIndex));
					listaDadosSessoes.add(dadoSessao);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaDadosSessoes;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
	
	public List<DadoSessao> buscarDadoSessaoPeloCodigoSessaoECodigoUsuario(Integer codigoSessao, Integer codigoUsuario){
		Cursor cursor = null;
		try {
			List<DadoSessao> listaDadosSessoes = new ArrayList<DadoSessao>();
			cursor = db.query("dadosessao", new String[]{"codigodadosessao", "codigosessao", "codigousuario", "codigoinstrumentocoleta", "valor"}, "codigousuario = ? AND codigosessao = ?", new String[]{String.valueOf(codigoUsuario),String.valueOf(codigoSessao)}, null, null, null);
			if(cursor.getCount() > 0){
				int codigoDadoSessaoIndex = cursor.getColumnIndex("codigodadosessao");
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int codigoInstrumentoColetaIndex = cursor.getColumnIndex("codigoinstrumentocoleta");
				int valorIndex = cursor.getColumnIndex("valor");
				cursor.moveToFirst();
				do{
					DadoSessao dadoSessao = new DadoSessao();
					dadoSessao.setCodigoDadoSessao(cursor.getInt(codigoDadoSessaoIndex));
					dadoSessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
					dadoSessao.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
					dadoSessao.setCodigoInstrumentoColeta(cursor.getInt(codigoInstrumentoColetaIndex));
					dadoSessao.setValor(cursor.getString(valorIndex));
					listaDadosSessoes.add(dadoSessao);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaDadosSessoes;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
	
	public Integer buscarDadoSessaoPeloCodigoSessaoCodigoUsuarioECodigoInstrumentoColeta(Integer codigoSessao, Integer codigoUsuario, Integer codigoIntrumentoColeta){
		Cursor cursor = null;
		DadoSessao dadoSessao = new DadoSessao();
		try {
			cursor = db.query("dadosessao", new String[]{"codigodadosessao", "codigosessao", "codigousuario", "codigoinstrumentocoleta", "valor"}, "codigousuario = ? AND codigosessao = ? AND codigoinstrumentocoleta = ?", new String[]{String.valueOf(codigoUsuario),String.valueOf(codigoSessao),String.valueOf(codigoIntrumentoColeta)}, null, null, null);
			if(cursor.getCount() > 0){
				int codigoDadoSessaoIndex = cursor.getColumnIndex("codigodadosessao");
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int codigoInstrumentoColetaIndex = cursor.getColumnIndex("codigoinstrumentocoleta");
				int valorIndex = cursor.getColumnIndex("valor");
				cursor.moveToFirst();
				dadoSessao.setCodigoDadoSessao(cursor.getInt(codigoDadoSessaoIndex));
				dadoSessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
				dadoSessao.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
				dadoSessao.setCodigoInstrumentoColeta(cursor.getInt(codigoInstrumentoColetaIndex));
				dadoSessao.setValor(cursor.getString(valorIndex));
				cursor.moveToNext();					
			}
			else{
				if(cursor != null){
					cursor.close();
					dataBaseHelper.close();
					db.close();
				}
				return null;
			}
			
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return dadoSessao.getCodigoDadoSessao();
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}	
	
	public List<DadoSessao> buscarTodosDadosSessoesPeloCodigoSessao(Integer codigo){
		Cursor cursor = null;
		try {
			List<DadoSessao> listaDadosSessoes = new ArrayList<DadoSessao>();
			cursor = db.query("dadosessao", new String[]{"codigodadosessao", "codigosessao", "codigousuario", "codigoinstrumentocoleta", "valor"}, "codigosessao = " + codigo, null, null, null, null);
			if(cursor.getCount() > 0){
				int codigoDadoSessaoIndex = cursor.getColumnIndex("codigodadosessao");
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int codigoInstrumentoColetaIndex = cursor.getColumnIndex("codigoinstrumentocoleta");
				int valorIndex = cursor.getColumnIndex("valor");
				cursor.moveToFirst();
				do{
					DadoSessao dadoSessao = new DadoSessao();
					dadoSessao.setCodigoDadoSessao(cursor.getInt(codigoDadoSessaoIndex));
					dadoSessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
					dadoSessao.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
					dadoSessao.setCodigoInstrumentoColeta(cursor.getInt(codigoInstrumentoColetaIndex));
					dadoSessao.setValor(cursor.getString(valorIndex));
					listaDadosSessoes.add(dadoSessao);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaDadosSessoes;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
}